package com.xxxx.server.utils;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigInteger;


/**
 * POI - world导出公共类
 *
 * @author : honors
 */
public class PoiWorldUtils {
    /**
     * world 文本
     */
    private XWPFDocument document;

    /**
     * 初始化
     */
    public PoiWorldUtils() {
        document = new XWPFDocument();
    }

    /**
     * 创建表格
     *
     * @param rows 行
     * @param cols 列
     */
    public XWPFTable createTable(int rows, int cols) {
        //创建表格
        XWPFTable table = document.createTable(rows, cols);
        //设置表格 - 属性
        setTableWidthAndHAlign(table, "8000", STJc.CENTER);
        return table;
    }

    public XWPFParagraph createParagraph() {
        //创建段落
        return document.createParagraph();
    }

    /**
     * 写出文件
     *
     * @param output 输出流
     * @throws IOException io异常
     */
    public void write(OutputStream output) throws IOException {
        document.write(output);
    }

    /**
     * 行 - 合并
     *
     * @param table     表格
     * @param row       所在行
     * @param startCell 起始列
     * @param endCell   终止列
     */
    public void columnMerge(XWPFTable table, int row, int startCell, int endCell) {
        for (int cellIndex = startCell; cellIndex <= endCell; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if (cellIndex == startCell) {
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    /**
     * 设置表格 - 属性
     *
     * @param table     表格
     * @param width     宽度
     * @param enumValue 格式
     */
    public void setTableWidthAndHAlign(XWPFTable table, String width,
            STJc.Enum enumValue) {
        CTTblPr tblPr = getTableCTTblPr(table);
        // 表格宽度
        CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
        if (enumValue != null) {
            CTJc cTJc = tblPr.addNewJc();
            cTJc.setVal(enumValue);
        }
        // 设置宽度
        tblWidth.setW(new BigInteger(width));
        tblWidth.setType(STTblWidth.DXA);
    }

    /**
     * 获取表格属性
     *
     * @param table 表格
     * @return CTTblPr
     */
    private CTTblPr getTableCTTblPr(XWPFTable table) {
        CTTbl ctTbl = table.getCTTbl();
        // 表格属性
        return ctTbl.getTblPr() == null ? ctTbl.addNewTblPr() : ctTbl.getTblPr();
    }

    /**
     * 实现功能描述：写内容
     *
     * @param url 文件路径
     * @return
     */
    public void writeContent(String url) throws IOException {
        try (OutputStream output = new FileOutputStream(url);) {
            write(output);
            output.flush();
        }
    }
}
